JavaScript์ AbortController๋ฅผ ์ฌ์ฉํ์ฌ fetch ์์ฒญ, ํ์ด๋จธ ๋ฑ๊ณผ ๊ฐ์ ๋น๋๊ธฐ ์์ ์ ํจ๊ณผ์ ์ผ๋ก ์ทจ์ํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ณ ๋ ๊น๋ํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์ฝ๋๋ฅผ ํ๋ณดํ์ธ์.
JavaScript AbortController: ๋น๋๊ธฐ ์์ ์ทจ์ ๋ง์คํฐํ๊ธฐ
์ต์ ์น ๊ฐ๋ฐ์์ ๋น๋๊ธฐ ์์
์ ์ด๋์๋ ์กด์ฌํฉ๋๋ค. API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ํ์ด๋จธ๋ฅผ ์ค์ ํ๊ณ , ์ฌ์ฉ์ ์ํธ ์์ฉ์ ์ฒ๋ฆฌํ๋ ์์
์ ๋
๋ฆฝ์ ์ผ๋ก ์คํ๋๊ณ ์ ์ฌ์ ์ผ๋ก ์ฅ์๊ฐ ์ง์๋๋ ์ฝ๋๋ฅผ ํฌํจํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ฃ๋๊ธฐ ์ ์ ์ด๋ฌํ ์์
์ ์ทจ์ํด์ผ ํ๋ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ฐ๋ก ์ด๋ด ๋ JavaScript์ AbortController
์ธํฐํ์ด์ค๊ฐ ๋์์ด ๋ฉ๋๋ค. DOM ์์
๋ฐ ๊ธฐํ ๋น๋๊ธฐ ์์
์ ์ทจ์ ์์ฒญ์ ์๋ฆฌ๋ ๊น๋ํ๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์ทจ์์ ํ์์ฑ ์ดํด
๊ธฐ์ ์ ์ธ ์ธ๋ถ ์ฌํญ์ ์ดํด๋ณด๊ธฐ ์ ์ ๋น๋๊ธฐ ์์ ์ทจ์๊ฐ ์ ์ค์ํ์ง ์ดํดํด ๋ณด๊ฒ ์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์.
- ์ฌ์ฉ์ ํ์: ์ฌ์ฉ์๊ฐ ๊ฒ์ ์ฟผ๋ฆฌ๋ฅผ ์์ํ์ฌ API ์์ฒญ์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. ์์ฒญ์ด ์๋ฃ๋๊ธฐ ์ ์ ๋ค๋ฅธ ํ์ด์ง๋ก ๋น ๋ฅด๊ฒ ์ด๋ํ๋ฉด ์๋ ์์ฒญ์ ๊ด๋ จ์ฑ์ด ์์ด์ง๋ฉฐ ๋ถํ์ํ ๋คํธ์ํฌ ํธ๋ํฝ๊ณผ ์ ์ฌ์ ์ธ ๋ถ์์ฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ทจ์ํด์ผ ํฉ๋๋ค.
- ์ ํ ์๊ฐ ๊ด๋ฆฌ: ๋น๋๊ธฐ ์์ ์ ๋ํ ์ ํ ์๊ฐ์ ์ค์ ํฉ๋๋ค. ์ ํ ์๊ฐ์ด ๋ง๋ฃ๋๊ธฐ ์ ์ ์์ ์ด ์๋ฃ๋๋ฉด ์ค๋ณต ์ฝ๋ ์คํ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ํ ์๊ฐ์ ์ทจ์ํด์ผ ํฉ๋๋ค.
- ์ปดํฌ๋ํธ ์ธ๋ง์ดํธ: React ๋๋ Vue.js์ ๊ฐ์ ํ๋ก ํธ์๋ ํ๋ ์์ํฌ์์ ์ปดํฌ๋ํธ๋ ์ข ์ข ๋น๋๊ธฐ ์์ฒญ์ ํฉ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋๋ฉด ํด๋น ์ปดํฌ๋ํธ์ ๊ด๋ จ๋ ์งํ ์ค์ธ ์์ฒญ์ ๋ฉ๋ชจ๋ฆฌ ๋์์ ์ธ๋ง์ดํธ๋ ์ปดํฌ๋ํธ ์ ๋ฐ์ดํธ๋ก ์ธํ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ทจ์ํด์ผ ํฉ๋๋ค.
- ๋ฆฌ์์ค ์ ์ฝ: ๋ฆฌ์์ค๊ฐ ์ ํ๋ ํ๊ฒฝ(์: ๋ชจ๋ฐ์ผ ์ฅ์น, ์๋ฒ ๋๋ ์์คํ )์์ ๋ถํ์ํ ์์ ์ ์ทจ์ํ๋ฉด ๊ท์คํ ๋ฆฌ์์ค๋ฅผ ํ๋ณดํ๊ณ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์๊ฐ ํ์ด์ง์ ํด๋น ์น์ ์ ์ง๋ ์คํฌ๋กคํ๋ฉด ํฐ ์ด๋ฏธ์ง ๋ค์ด๋ก๋๋ฅผ ์ทจ์ํฉ๋๋ค.
AbortController ๋ฐ AbortSignal ์๊ฐ
AbortController
์ธํฐํ์ด์ค๋ ๋น๋๊ธฐ ์์
์ทจ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค. ๋ ๊ฐ์ง ์ฃผ์ ๊ตฌ์ฑ ์์๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- AbortController: ์ด ๊ฐ์ฒด๋ ์ทจ์ ์ ํธ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ทจ์ ์์ฒญ์ ์๋ฆฌ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋จ์ผ ๋ฉ์๋์ธ
abort()
๊ฐ ์์ต๋๋ค. - AbortSignal: ์ด ๊ฐ์ฒด๋ ์์
์ด ์ค๋จ๋์ด์ผ ํจ์ ๋ํ๋ด๋ ์ ํธ๋ฅผ ๋ํ๋
๋๋ค.
AbortController
์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉฐ ์ทจ์ ๊ฐ๋ฅํด์ผ ํ๋ ๋น๋๊ธฐ ์์ ์ ์ ๋ฌ๋ฉ๋๋ค.
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ: Fetch ์์ฒญ ์ทจ์
fetch
์์ฒญ์ ์ทจ์ํ๋ ๊ฐ๋จํ ์์ ๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค.
const controller = new AbortController();
const signal = controller.signal;
fetch('https://api.example.com/data', { signal })
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
return response.json();
})
.then(data => {
console.log('Data:', data);
})
.catch(error => {
if (error.name === 'AbortError') {
console.log('Fetch aborted');
} else {
console.error('Fetch error:', error);
}
});
// To cancel the fetch request:
controller.abort();
์ค๋ช :
AbortController
์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค.controller
์์ ์ฐ๊ฒฐ๋AbortSignal
์ ๊ฐ์ ธ์ต๋๋ค.signal
์fetch
์ต์ ์ ์ ๋ฌํฉ๋๋ค.- ์์ฒญ์ ์ทจ์ํด์ผ ํ๋ ๊ฒฝ์ฐ
controller.abort()
๋ฅผ ํธ์ถํฉ๋๋ค. .catch()
๋ธ๋ก์์ ์ค๋ฅ๊ฐAbortError
์ธ์ง ํ์ธํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์์ฒญ์ด ์ทจ์๋ ๊ฒ์ ๋๋ค.
AbortError ์ฒ๋ฆฌ
controller.abort()
๊ฐ ํธ์ถ๋๋ฉด fetch
์์ฒญ์ด AbortError
์ ํจ๊ป ๊ฑฐ๋ถ๋ฉ๋๋ค. ์ฝ๋์์ ์ด ์ค๋ฅ๋ฅผ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฒ๋ฆฌ๋์ง ์์ ํ๋ก๋ฏธ์ค ๊ฑฐ๋ถ ๋ฐ ์๊ธฐ์น ์์ ๋์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ค์์ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ํฌํจ๋ ๋์ฑ ๊ฐ๋ ฅํ ์์ ์ ๋๋ค.
const controller = new AbortController();
const signal = controller.signal;
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data', { signal });
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const data = await response.json();
console.log('Data:', data);
return data;
} catch (error) {
if (error.name === 'AbortError') {
console.log('Fetch aborted');
return null; // Or throw the error to be handled further up
} else {
console.error('Fetch error:', error);
throw error; // Re-throw the error to be handled further up
}
}
}
fetchData();
// To cancel the fetch request:
controller.abort();
AbortError ์ฒ๋ฆฌ ๋ชจ๋ฒ ์ฌ๋ก:
- ์ค๋ฅ ์ด๋ฆ ํ์ธ: ์ฌ๋ฐ๋ฅธ ์ค๋ฅ ์ ํ์ ์ฒ๋ฆฌํ๊ณ ์๋์ง ํ์ธํ๋ ค๋ฉด ํญ์
error.name === 'AbortError'
์ธ์ง ํ์ธํ์ธ์. - ๊ธฐ๋ณธ๊ฐ ๋ฐํ ๋๋ ๋ค์ throw: ์ ํ๋ฆฌ์ผ์ด์
์ ๋
ผ๋ฆฌ์ ๋ฐ๋ผ ๊ธฐ๋ณธ๊ฐ(์:
null
)์ ๋ฐํํ๊ฑฐ๋ ํธ์ถ ์คํ์์ ๋ ๋์ด ์ฒ๋ฆฌ๋๋๋ก ์ค๋ฅ๋ฅผ ๋ค์ throwํ ์ ์์ต๋๋ค. - ๋ฆฌ์์ค ์ ๋ฆฌ: ๋น๋๊ธฐ ์์
์ด ๋ฆฌ์์ค(์: ํ์ด๋จธ, ์ด๋ฒคํธ ๋ฆฌ์ค๋)๋ฅผ ํ ๋นํ ๊ฒฝ์ฐ
AbortError
์ฒ๋ฆฌ๊ธฐ์์ ์ ๋ฆฌํฉ๋๋ค.
AbortSignal์ ์ฌ์ฉํ์ฌ ํ์ด๋จธ ์ทจ์
AbortSignal
์ setTimeout
๋๋ setInterval
๋ก ์์ฑ๋ ํ์ด๋จธ๋ฅผ ์ทจ์ํ๋ ๋ฐ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ๊ธฐ๋ณธ ์ ๊ณต ํ์ด๋จธ ๊ธฐ๋ฅ์ AbortSignal
์ ์ง์ ์ง์ํ์ง ์์ผ๋ฏ๋ก ์ฝ๊ฐ ๋ ์๋์ ์ธ ์์
์ด ํ์ํฉ๋๋ค. abort ์ ํธ๋ฅผ ์์ ํ๊ณ ํธ๋ฆฌ๊ฑฐ๋ ๋ ํ์ด๋จธ๋ฅผ ์ง์ฐ๋ ์ฌ์ฉ์ ์ง์ ํจ์๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
function cancellableTimeout(callback, delay, signal) {
let timeoutId;
const timeoutPromise = new Promise((resolve, reject) => {
timeoutId = setTimeout(() => {
resolve(callback());
}, delay);
signal.addEventListener('abort', () => {
clearTimeout(timeoutId);
reject(new Error('Timeout Aborted'));
});
});
return timeoutPromise;
}
const controller = new AbortController();
const signal = controller.signal;
cancellableTimeout(() => {
console.log('Timeout executed');
}, 2000, signal)
.then(() => console.log("Timeout finished successfully"))
.catch(err => console.log(err));
// To cancel the timeout:
controller.abort();
์ค๋ช :
cancellableTimeout
ํจ์๋ ์ฝ๋ฐฑ, ์ง์ฐ ๋ฐAbortSignal
์ ์ธ์๋ก ์ฌ์ฉํฉ๋๋ค.setTimeout
์ ์ค์ ํ๊ณ ์๊ฐ ์ด๊ณผ ID๋ฅผ ์ ์ฅํฉ๋๋ค.abort
์ด๋ฒคํธ๋ฅผ ์์ ํ๋AbortSignal
์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.abort
์ด๋ฒคํธ๊ฐ ํธ๋ฆฌ๊ฑฐ๋๋ฉด ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ์๊ฐ ์ด๊ณผ๋ฅผ ์ง์ฐ๊ณ ํ๋ก๋ฏธ์ค๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค.
์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ทจ์
ํ์ด๋จธ์ ์ ์ฌํ๊ฒ AbortSignal
์ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ทจ์ํ ์ ์์ต๋๋ค. ์ด๋ ์ธ๋ง์ดํธ๋๋ ์ปดํฌ๋ํธ์ ์ฐ๊ฒฐ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ ๊ฑฐํ๋ ค๋ ๊ฒฝ์ฐ ํนํ ์ ์ฉํฉ๋๋ค.
const controller = new AbortController();
const signal = controller.signal;
const button = document.getElementById('myButton');
button.addEventListener('click', () => {
console.log('Button clicked!');
}, { signal });
// To cancel the event listener:
controller.abort();
์ค๋ช :
signal
์addEventListener
๋ฉ์๋์ ์ต์ ์ผ๋ก ์ ๋ฌํฉ๋๋ค.controller.abort()
๊ฐ ํธ์ถ๋๋ฉด ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ์๋์ผ๋ก ์ ๊ฑฐ๋ฉ๋๋ค.
React ์ปดํฌ๋ํธ์ AbortController
React์์ AbortController
๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋ ๋ ๋น๋๊ธฐ ์์
์ ์ทจ์ํ ์ ์์ต๋๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋์์ ์ธ๋ง์ดํธ๋ ์ปดํฌ๋ํธ ์
๋ฐ์ดํธ๋ก ์ธํ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ํ์์ ์
๋๋ค. ๋ค์์ useEffect
ํํฌ๋ฅผ ์ฌ์ฉํ๋ ์์
๋๋ค.
import React, { useState, useEffect } from 'react';
function MyComponent() {
const [data, setData] = useState(null);
useEffect(() => {
const controller = new AbortController();
const signal = controller.signal;
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data', { signal });
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const data = await response.json();
setData(data);
} catch (error) {
if (error.name === 'AbortError') {
console.log('Fetch aborted');
} else {
console.error('Fetch error:', error);
}
}
}
fetchData();
return () => {
controller.abort(); // Cancel the fetch request when the component unmounts
};
}, []); // Empty dependency array ensures this effect runs only once on mount
return (
{data ? (
Data: {JSON.stringify(data)}
) : (
Loading...
)}
);
}
export default MyComponent;
์ค๋ช :
useEffect
ํํฌ ๋ด์์AbortController
๋ฅผ ๋ง๋ญ๋๋ค.signal
์fetch
์์ฒญ์ ์ ๋ฌํฉ๋๋ค.useEffect
ํํฌ์์ ์ ๋ฆฌ ํจ์๋ฅผ ๋ฐํํฉ๋๋ค. ์ด ํจ์๋ ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋ ๋ ํธ์ถ๋ฉ๋๋ค.- ์ ๋ฆฌ ํจ์ ๋ด์์
controller.abort()
๋ฅผ ํธ์ถํ์ฌ fetch ์์ฒญ์ ์ทจ์ํฉ๋๋ค.
๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก
AbortSignal ์ฐ๊ฒฐ
๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ฌ๋ฌ AbortSignal
์ ํจ๊ป ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์์ ์ปดํฌ๋ํธ์์ ์์
์ ์ทจ์ํด์ผ ํ๋ ์์ ์ปดํฌ๋ํธ๊ฐ ์์ ์ ์์ต๋๋ค. ์ AbortController
๋ฅผ ๋ง๋ค๊ณ ํด๋น ์ ํธ๋ฅผ ์์ ๋ฐ ์์ ์ปดํฌ๋ํธ์ ๋ชจ๋ ์ ๋ฌํ์ฌ ์ด๋ฅผ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป AbortController ์ฌ์ฉ
AbortSignal
์ ์ง์ ์ง์ํ์ง ์๋ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ทจ์ ๋ฉ์ปค๋์ฆ๊ณผ ํจ๊ป ์๋ํ๋๋ก ์ฝ๋๋ฅผ ์กฐ์ ํด์ผ ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ AbortSignal
์ ์ฒ๋ฆฌํ๋ ์์ฒด ํจ์์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋น๋๊ธฐ ํจ์๋ฅผ ๋ํํ๋ ์์
์ด ํฌํจ๋ ์ ์์ต๋๋ค.
AbortController ์ฌ์ฉ์ ์ด์
- ํฅ์๋ ์ฑ๋ฅ: ๋ถํ์ํ ์์ ์ ์ทจ์ํ๋ฉด ๋คํธ์ํฌ ํธ๋ํฝ, CPU ์ฌ์ฉ๋ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์๋น๋ฅผ ์ค์ฌ ํนํ ๋ฆฌ์์ค๊ฐ ์ ํ๋ ์ฅ์น์์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๋ ๊น๋ํ ์ฝ๋:
AbortController
๋ ์ทจ์๋ฅผ ๊ด๋ฆฌํ๋ ํ์คํ๋๊ณ ์ฐ์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ์ฝ๋๋ฅผ ๋ ์ฝ๊ธฐ ์ฝ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. - ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง: ์ธ๋ง์ดํธ๋ ์ปดํฌ๋ํธ์ ๊ด๋ จ๋ ๋น๋๊ธฐ ์์ ์ ์ทจ์ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์์ ์ธ๋ง์ดํธ๋ ์ปดํฌ๋ํธ ์ ๋ฐ์ดํธ๋ก ์ธํ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ: ๊ด๋ จ ์๋ ์์ฒญ์ ์ทจ์ํ๋ฉด ์ค๋๋ ์ ๋ณด๊ฐ ํ์๋์ง ์๊ณ ์ธ์๋๋ ๋๊ธฐ ์๊ฐ์ด ์ค์ด๋ค์ด ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ํธํ์ฑ
AbortController
๋ Chrome, Firefox, Safari ๋ฐ Edge๋ฅผ ํฌํจํ ์ต์ ๋ธ๋ผ์ฐ์ ์์ ๋๋ฆฌ ์ง์๋ฉ๋๋ค. ์ต์ ์ ๋ณด๋ MDN Web Docs์์ ํธํ์ฑ ํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
Polyfill
AbortController
๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ์ง ์๋ ์ด์ ๋ธ๋ผ์ฐ์ ์ ๊ฒฝ์ฐ Polyfill์ ์ฌ์ฉํ ์ ์์ต๋๋ค. Polyfill์ ์ด์ ๋ธ๋ผ์ฐ์ ์์ ์ต์ ๊ธฐ๋ฅ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ฝ๋ ์กฐ๊ฐ์
๋๋ค. ์จ๋ผ์ธ์์ ์ฌ์ฉํ ์ ์๋ ์ฌ๋ฌ AbortController
Polyfill์ด ์์ต๋๋ค.
๊ฒฐ๋ก
AbortController
์ธํฐํ์ด์ค๋ JavaScript์์ ๋น๋๊ธฐ ์์
์ ๊ด๋ฆฌํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์
๋๋ค. AbortController
๋ฅผ ์ฌ์ฉํ๋ฉด ์ทจ์๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ ๊น๋ํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋๋ฉฐ ๊ฐ๋ ฅํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋, ํ์ด๋จธ๋ฅผ ์ค์ ํ๊ฑฐ๋, ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๊ด๋ฆฌํ๋ ๋ฑ AbortController
๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ ๋ฐ์ ์ธ ํ์ง์ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.